package com.yunhai.common.dto;

import com.baomidou.mybatisplus.core.metadata.IPage;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import java.util.ArrayList;
import java.util.List;

@Data
@ApiModel
public class Ret<T>{

    public static Integer OK_CODE = 200;
    public static Integer FAILURE_CODE = -1;
    public static Integer INNER_EXCEPTION_CODE = 500;

    //内码
    @ApiModelProperty(value = "内码，0表示成功，非0表示失败")
    private Integer code;
    //内码对应消息
    @ApiModelProperty(value="内码对应的消息文字内容")
    private String msg;
    //返回数据
    @ApiModelProperty(value="数据载体")
    private T data;
    //额外提示数据
    private Object errorData;
    @ApiModelProperty(value="服务器时间")
    private Long serverTime;

    //有消息形式的返回成功
    public static  Ret ok( Object data ){

        Ret r = new Ret();
        r.setCode(OK_CODE);
        r.setMsg("ok");
        r.setData(data);
        return r;
    }

    //无消息形式的返回成功
    public static Ret ok(){
        return ok(true);
    }


    //分页形式的消息返回成功
    public static Ret ok( Long pageIndex, Long pageSize,  Long total,  List data ){

        //处理分页列表数据返回 null 导致数据不规范问题
        if( data == null ){
            data = new ArrayList();
        }
        PageRet pageResVo = new PageRet();
        pageResVo.setPageIndex(pageIndex).setPageSize(pageSize).setTotal(total).setList(data);
        return ok(pageResVo);
    }

    public static Ret toPage( IPage page ){
        return Ret.ok( page.getCurrent(), page.getSize(), page.getTotal(), page.getRecords() );
    }


    //返回自定义编码和内容的信息
    public static Ret fail( Integer code, String msg ){

        Ret r = new Ret();
        r.setCode(code);
        r.setMsg(msg);
        r.setData(null);
        return r;
    }

    //失败返回默认信息
    public static Ret fail(){
        return  fail(FAILURE_CODE, "");
    }

    public static Ret fail( Object data ){
        Ret r = new Ret();
        r.setCode(400);
        r.setMsg("参数错误");
        r.setData(null);
        r.setErrorData(data);
        return r;
    }
}
